Hilt
Hilt是Android的DI library,基於Dagger基礎上的。
DI(Dependency Injection): 目的是讓開發者能夠寫出低耦合的程式碼。類別裡的屬性就是這個類的依賴,通過創建的方式對屬性進行賦值就是依賴注入。
@HiltAndroidApp:使用Hilt必須聲明有@HiltAndroidApp註解的Application。
@AndroidEntryPoint:使用在Activity、Fragment、View、Service、BroadcastReceiver。
1.Activity:只支持ComponentActivity的子類例如FragmentActivity、AppCompatActivity。
2.Fragment:只支持androidx.Fragment。
@Inject:提供該類的創建。
@Singleton:聲明為單例。
Gradle(Project)
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
Gradle(Module)
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
implementation "com.google.dagger:hilt-android:$hiltVersion"
kapt "com.google.dagger:hilt-android-compiler:$hiltVersion"
自定義Application
@HiltAndroidApp
class MyApplication : Application() {
//初始化
}
聲明Application
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
要被注入的類
class Hello @Inject constructor(){
fun talk() {
Log.d("GGG", "Hello")
}
}
使用Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var hello: Hello
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
info.setOnClickListener {
info.text = hello.talk()
}
info.setOnLongClickListener {
info.text = hello.talk("Hello")
true
}
}
}